home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / examples / perfmon2 / perfmon2.s < prev   
Text File  |  1996-04-12  |  21KB  |  939 lines

  1. ;-------------------------------------------------------------------------------
  2. *                                                                              *
  3. * PerfMon  2                                                                   *
  4. *                                                                              *
  5. * Copyright © 1993,1994 by Daniel Weber                                        *
  6. * All Rights Reserved Worldwide                                                *
  7. *                                                                              *
  8. *                                                                              *
  9. *       Filename        perfmon.s                                              *
  10. *       Author          Daniel Weber                                           *
  11. *       Version         1.40                                                   *
  12. *       Start           30.10.93                                               *
  13. *                                                                              *
  14. *       Last Revision   19.11.94                                               *
  15. *                                                                              *
  16. ;-------------------------------------------------------------------------------
  17. *                                                                              *
  18. *       NOTE            Since AddPort(exec) attaches a message port structure  *
  19. *                       to the system's public message port list, and I        *
  20. *                       decided that the PerfMon ports are no public at all    *
  21. *                       no ports will be added to the system's public message  *
  22. *                       port list. Thus no AddPort() and no RemPort() are      *
  23. *                       needed.                                                *
  24. *                                                                              *
  25. *                       This version uses the progressbar.r routine file...    *
  26. *                                                                              *
  27. ;-------------------------------------------------------------------------------
  28.  
  29.     output    'ram:perfmon2'
  30.  
  31.     opt    o+,q+,ow-,qw-,sw-
  32.     verbose
  33.     base    progbase
  34.  
  35.     filenote    'PerfMon2, Copyright © 1993,1994 by Daniel Weber'
  36.  
  37. ;    equfile        ram:perfmon2.equ
  38. ;    creffile    ram:perfmon2.cref
  39.  
  40. ;-------------------------------------------------------------------------------
  41.  
  42.     incdir    'include:'
  43.     incdir    'routines:'
  44.  
  45.     incequ    'LVO.s'
  46.     include    'basicmac.r'
  47.  
  48.     include    'devices/timer.i'
  49.     include    'exec/execbase.i'
  50.     include    'exec/tasks.i'
  51.     include    'exec/ports.i'
  52.     include    'intuition/intuition.i'
  53.     include    'graphics/rastport.i'
  54.     include    'dos/dos.i'
  55.     include    'support.mac'
  56.     include    'tasktricks.r'
  57.  
  58. ;-------------------------------------------------------------------------------
  59.  
  60. version        equr    "1.40"
  61. gea_progname    equr    "PerfMon2"
  62.  
  63. ;-- startup control  --
  64. cws_V36PLUSONLY    set    1
  65. cws_DETACH    set    1            ;detach from CLI
  66. cws_EASYLIB    set    1
  67.  
  68. ;-- user definitions --
  69. AbsExecBase    equ    4
  70.  
  71. DOS.LIB        equ    36
  72. INTUITION.LIB    equ    36
  73. GRAPHICS.LIB    equ    36
  74.  
  75. Daemon_Pri    equ    -128
  76.  
  77. seconds:    equ    1
  78. micros        equ    0            ;5*100000
  79.  
  80.  
  81. workspace    equ    32
  82.  
  83. WindowHeight    equ    12
  84. WindowWidth    equ    88
  85. textxstart:    equ    4
  86. textystart    equ    8
  87.  
  88. bar1_x        EQU    4            ; ProgressBar dimensions
  89. bar1_y        EQU    2
  90. bar1_width    EQU    WindowWidth-2*bar1_x
  91. bar1_height    EQU    WindowHeight-2*bar1_y
  92.  
  93.  
  94. ;-------------------------------------------------------------------------------
  95. progbase:
  96.     jmp    AutoDetach(pc)
  97.     dc.b    "DAW!"
  98.     dc.b    0,"$VER: ",gea_progname," ",version," (",__date2,")",0
  99.     even
  100.  
  101. ;----------------------------
  102. clistartup:
  103.     lea    progbase(pc),a5
  104.     lea    PrintTitle(pc),a0
  105.     bsr    ReplySync
  106.  
  107.     sub.l    a0,a0                ;detach completely
  108.     bsr    ReplySync
  109.  
  110. wbstartup:
  111.     lea    progbase(pc),a5
  112.  
  113.     lea    dxstart(pc),a1            ;clear DX area
  114.     move.w    #(dxend-dxstart)/2-1,d7
  115. .clr:    clr.w    (a1)+
  116.     dbra    d7,.clr
  117.  
  118.     InitList_    TimePort+MP_MSGLIST    ; init port structures
  119.     InitList_    TimePort2+MP_MSGLIST    ; correctly (empty list)
  120.  
  121.  
  122. .allocsignal:                    ;allocate handshake signal
  123.     move.l    4.w,a6
  124.     move.l    ThisTask(a6),MasterTask(a5)
  125.  
  126.     moveq    #-1,d0
  127.     jsr    _LVOAllocSignal(a6)
  128.     move.l    d0,HandShakeSig(a5)
  129.     bmi    .nosignal
  130.     moveq    #0,d1
  131.     bset    d0,d1
  132.     move.l    d1,HandShakeMask(a5)
  133.  
  134.     moveq    #-1,d0
  135.     jsr    _LVOAllocSignal(a6)
  136.     move.l    d0,SignalNumber2(a5)
  137.     move.l    d0,d2
  138.     bmi    .nosignal2
  139.  
  140. .port:    lea    TimePort2(pc),a1
  141.     move.l    4.w,a6
  142.     move.b    #NT_MSGPORT,LN_TYPE(a1)
  143.     move.b    #PA_SIGNAL,MP_FLAGS(a1)
  144.     move.b    d2,MP_SIGBIT(a1)
  145.     move.l    ThisTask(a6),MP_SIGTASK(a1)
  146.     clr.l    LN_NAME(a1)
  147. ;    jsr    _LVOAddPort(a6)
  148.  
  149. .device:                    ;open timer device
  150.     lea    TimeRequest2(pc),a1
  151.     moveq    #UNIT_MICROHZ,d0
  152.     moveq    #0,d1
  153.     lea    TimerName(pc),a0
  154.     jsr    _LVOOpenDevice(a6)
  155.     tst.l    d0
  156.     bne    .freesignal
  157.     seq    timeropened(a5)            ;flag if timer.device open
  158.     move.l    TimeRequest+IO_DEVICE(pc),TimerBase(a5)
  159.  
  160.  
  161. .main:    lea    NewWindowStructure(pc),a0
  162.     move.l    IntBase(pc),a6
  163.     jsr    _LVOOpenWindow(a6)
  164.     move.l    d0,Windowhandle(a5)
  165.     move.l    d0,bar1_wd(a5)
  166.     beq    .cleanup
  167.     move.l    d0,a0                ;add menu list to window
  168.     lea    MenuList(pc),a1
  169.     jsr    _LVOSetMenuStrip(a6)
  170.  
  171.     move.l    Windowhandle(pc),a3        ;set font and pens...
  172.     move.l    wd_RPort(a3),a3
  173.     move.l    a3,a1
  174.     moveq    #1,d0
  175.     move.l    GfxBase(pc),a6
  176.     jsr    _LVOSetAPen(a6)
  177.     move.l    a3,a1
  178.     moveq    #0,d0
  179.     jsr    _LVOSetBPen(a6)
  180.  
  181.     move.l    a3,a1
  182.     moveq    #RP_COMPLEMENT,d0
  183.     jsr    _LVOSetDrMd(a6)
  184.  
  185.     lea    Topaz80(pc),a0
  186.     jsr    _LVOOpenFont(a6)
  187.     move.l    d0,WindowFont(a5)
  188.     beq.s    .install
  189.     move.l    d0,a0
  190.     move.l    a3,a1
  191.     jsr    _LVOSetFont(a6)
  192.  
  193.  
  194.  
  195.     lea    bar1(pc),a0
  196.     move.l    Windowhandle(pc),a1
  197.     clr.l    pgb_value(a0)
  198.     CALL_    InitProgressBar
  199.  
  200. .install:
  201.     bsr    InstallDaemon
  202.     beq    .nodaemon
  203.  
  204.     bsr    main
  205.  
  206.  
  207. .killslave:
  208.     move.l    4.w,a6
  209.     jsr    _LVOForbid(a6)
  210.     lea    TaskReady(a6),a0    ;slave should be in the ready list
  211.     lea    DaemonNameReal(pc),a1
  212.     jsr    _LVOFindName(a6)
  213.     tst.l    d0
  214.     beq.s    .nos
  215.     move.l    #SIGBREAKF_CTRL_C,d0
  216.     move.l    DaemonTask(pc),d1
  217.     beq.s    .nos
  218.     move.l    d1,a1
  219.     jsr    _LVOSignal(a6)
  220. .nos:    jsr    _LVOPermit(a6)
  221.  
  222. ;
  223. ; clean up and exit
  224. ;
  225. .nodaemon:                ;NOTE:  if a setup error occures, no
  226. .nosignal:                ;message will be reported to the user
  227. .nosignal2:                ;
  228.  
  229. .cleanup:                ;close window
  230.     move.l    WindowFont(pc),d0
  231.     beq.s    .closewd
  232.     move.l    d0,a1
  233.     move.l    GfxBase(pc),a6
  234.     jsr    _LVOCloseFont(a6)
  235.  
  236. .closewd:
  237.     move.l    Windowhandle(pc),d6
  238.     beq.s    .closedevice
  239.     move.l    d6,a0
  240.     move.l    IntBase(pc),a6
  241.     jsr    _LVOClearMenuStrip(a6)
  242.     move.l    d6,a0
  243.     jsr    _LVOCloseWindow(a6)
  244.  
  245. .closedevice:
  246.     tst.b    timeropened(a5)        ;timer.device open?
  247.     beq.s    .freesignal
  248.     lea    TimeRequest2(pc),a1
  249.     move.l    4.w,a6
  250.     jsr    _LVOCloseDevice(a6)
  251.  
  252. .freesignal:                ;free the handshake & timer signal (good)
  253.     move.l    SignalNumber2(pc),d0
  254.     bmi.s    .sig1
  255.     move.l    4.w,a6
  256.     jsr    _LVOFreeSignal(a6)
  257.  
  258. .rport:
  259. ;    lea    TimePort2(pc),a1
  260. ;    move.l    4.w,a6
  261. ;    jsr    _LVORemPort(a6)
  262.  
  263. .sig1:    tst.l    HandShakeMask(a5)
  264.     beq.s    .exit
  265.     move.l    4.w,a6
  266.     move.l    HandShakeSig(pc),d0
  267.     jsr    _LVOFreeSignal(a6)
  268.  
  269. .exit:    moveq    #0,d0            ;exit...
  270.     bra    ReplyWBMsg
  271.  
  272.  
  273.  
  274. ;-------------------------------------------------------------------------------
  275. *
  276. * main
  277. *
  278. ;-------------------------------------------------------------------------------
  279.  
  280.  
  281. main:    lea    progbase(pc),a5
  282.  
  283. .wait:    lea    TimeRequest2(pc),a1
  284.     mea    TimePort2(pc),MN_REPLYPORT(a1)
  285.     move.w    #TR_GETSYSTIME,IO_COMMAND(a1)
  286.     move.b    #IOF_QUICK,IO_FLAGS(a1)
  287.     move.l    4.w,a6
  288.     jsr    _LVODoIO(a6)                ;get system time...
  289.     move.l    TimerBase(pc),a6
  290.     lea    ResultTime2(pc),a0
  291.     lea    TimeRequest2+IOTV_TIME(pc),a1
  292.     clr.l    TV_SECS(a0)
  293.     clr.l    TV_MICRO(a0)
  294.     jsr    _LVOSubTime(a6)
  295.     clr.l    ResultTime+TV_SECS(a5)
  296.     clr.l    ResultTime+TV_MICRO(a5)
  297.  
  298.     lea    TimeRequest2(pc),a1
  299.     mea    TimePort2(pc),MN_REPLYPORT(a1)
  300.     move.w    #TR_ADDREQUEST,IO_COMMAND(a1)
  301.     move.l    #seconds,IOTV_TIME+TV_SECS(a1)
  302.     move.l    #micros,IOTV_TIME+TV_MICRO(a1)
  303.     move.l    4.w,a6
  304.     jsr    _LVOSendIO(a6)                ;wait time (1 sec)
  305.  
  306. .loop:    move.l    SignalNumber2(pc),d1
  307.     moveq    #0,d0
  308.     bset    d1,d0
  309.     move.l    d0,d7
  310.     move.l    Windowhandle(pc),a0
  311.     move.l    wd_UserPort(a0),a0
  312.     move.l    a0,a3
  313.     move.b    MP_SIGBIT(a0),d1
  314.     bset    d1,d0
  315.     move.l    4.w,a6
  316.     jsr    _LVOWait(a6)
  317.  
  318.     cmp.l    d7,d0
  319.     beq.s    .timer
  320.  
  321. ;
  322. ; a window message received... (only MENUPICK as IDCMP set)
  323. ;
  324. ; a3: wd_UserPort
  325. ; a6: execbase
  326. ;
  327. .window:
  328.     move.l    4.w,a6
  329.     move.l    Windowhandle(pc),a0
  330.     move.l    wd_UserPort(a0),a0
  331.     jsr    _LVOGetMsg(a6)
  332.     move.l    d0,a1
  333.     move.l    a1,d0
  334.     beq.s    .exit
  335.     move.l    im_Class(a1),d4        ;IDCMP flags
  336.     move.w    im_Code(a1),d5        ;menu number
  337.     move.l    im_IAddress(a1),d6    ;pointer to a gadget or menu item etc.
  338.     jsr    _LVOReplyMsg(a6)
  339.  
  340.     lea    .eventtable(pc),a0
  341. .event:    move.w    (a0)+,d0
  342.     beq.s    .window
  343.     cmp.w    d0,d5
  344.     movea.l    (a0)+,a1
  345.     bne.s    .event
  346.     jsr    (a1)
  347.     bra.s    .window
  348. .exit:    tst.b    quitflag(a5)        ;exit if quitflag set
  349.     beq    .loop
  350.     rts
  351.  
  352.  
  353. .eventtable:                ;dc.w <im_Code>; dc.l <routine>
  354.     dc.w    (-1<<11)|(0<<5)|(0)    ;About
  355.     dc.l    DoAbout
  356.     dc.w    (-1<<11)|(1<<5)|(0)    ;Quit
  357.     dc.l    DoQuit
  358.     dc.w    0
  359.  
  360.  
  361. ;
  362. ; message received from timer...
  363. ;
  364. ; a6: execbase
  365. ;
  366. .timer:
  367.     lea    progbase(pc),a5
  368.     move.l    4.w,a6
  369.     jsr    _LVOForbid(a6)
  370.     lea    TimeRequest2(pc),a1
  371.     mea    TimePort2(pc),MN_REPLYPORT(a1)
  372.     move.w    #TR_GETSYSTIME,IO_COMMAND(a1)
  373.     move.b    #IOF_QUICK,IO_FLAGS(a1)
  374.     jsr    _LVODoIO(a6)                ;get system time
  375.     move.l    TimerBase(pc),a6
  376.     lea    ResultTime2(pc),a0
  377.     lea    TimeRequest2+IOTV_TIME(pc),a1
  378.     jsr    _LVOAddTime(a6)                ;=> passed time
  379.  
  380. .evaluate:
  381.     move.l    ResultTime2+TV_SECS(pc),d0
  382.     move.l    #1000000,d1                ;10^6
  383.     bsr    mulu32
  384.     add.l    ResultTime2+TV_MICRO(pc),d0        ;passed time in micros
  385.     move.l    d0,d7
  386.  
  387.     move.l    ResultTime+TV_SECS(pc),d0
  388.     move.l    #1000000,d1                ;10^6
  389.     bsr    mulu32
  390.     add.l    ResultTime+TV_MICRO(pc),d0        ;slave time in micros
  391.  
  392.     move.l    d7,d4
  393.     sub.l    d0,d7
  394.     exg    d7,d0
  395.     move.l    #1000,d1
  396.     bsr    mulu32
  397.     move.l    d4,d1
  398.     bsr    divu32
  399.     move.w    d0,bar1+pgb_value+2(a5)
  400.     divu    #10,d0
  401.     move.l    d0,d1
  402.     swap    d1                    ;remainder
  403.  
  404.     move.l    4.w,a6
  405.     jsr    _LVOPermit(a6)
  406.  
  407.     move.w    d0,rawlist(a5)
  408.     move.w    d1,rawlist+2(a5)
  409.  
  410.  
  411.     lea    cpuloadtxt(pc),a0
  412.     lea    rawlist(pc),a1
  413.     lea    workbuffer(pc),a3
  414.     bsr    DoRawFmt
  415.  
  416.     lea    bar1(pc),a0
  417.     CALL_    SetProgressBar
  418.  
  419.     move.l    GfxBase(pc),a6
  420.     move.l    Windowhandle(pc),a1
  421.     move.l    wd_RPort(a1),a1
  422.     move.l    a1,a3
  423.     moveq    #textxstart,d0
  424.     moveq    #textystart,d1
  425.     jsr    _LVOMove(a6)
  426.     move.l    a3,a1
  427.     lea    workbuffer(pc),a0
  428.     moveq    #-1,d0
  429.     move.l    a0,a3
  430. .cnt:    addq.l    #1,d0
  431.     tst.b    (a3)+
  432.     bne.s    .cnt
  433.     jsr    _LVOText(a6)
  434.     clr.l    ResultTime+TV_SECS(a5)
  435.     clr.l    ResultTime+TV_MICRO(a5)
  436.     bra    .wait
  437.  
  438.  
  439.  
  440.  
  441. ;------------------------------------------------
  442. ;
  443. ; DoQuit    - (CCR =>  0: don't  -:quit)
  444. ;
  445. DoQuit:
  446.     st    quitflag(a5)
  447.     rts
  448.  
  449.     
  450. ;------------------------------------------------
  451. ;
  452. ; DoAbout    - (CCR => must be 0)
  453. ;
  454. DoAbout:
  455.     move.l    IntBase(pc),a6
  456.     move.l    Windowhandle(pc),a0
  457.     lea    easystruct(pc),a1
  458.     suba.l    a2,a2
  459.     lea    rawlist(pc),a3
  460.     jsr    _LVOEasyRequestArgs(a6)
  461.     rts
  462.  
  463.  
  464. ;-------------------------------------------------------------------------------
  465. *
  466. * subroutines
  467. *
  468. ;-------------------------------------------------------------------------------
  469.  
  470.  
  471.  
  472. ;------------------------------------------------
  473. ;
  474. ; (simple) arithmetic subroutines
  475. ;
  476. ; d0=d0*d1
  477. ;
  478. ; d0/d1/d5/d6 affected...
  479. ;
  480. mulu32:
  481.     move.l    d0,d6
  482.     move.w    d0,d5
  483.     mulu    d1,d5            ;lo*lo
  484.     swap    d1
  485.     mulu    d1,d0            ;hi*lo
  486.     swap    d0
  487.     add.l    d5,d0
  488.     swap    d6
  489.     move.w    d6,d5
  490.     mulu    d1,d5            ;hi*hi
  491.     swap    d1
  492.     mulu    d1,d6            ;lo*hi
  493.     swap    d6
  494.     add.l    d6,d0
  495.     rts
  496.  
  497. ;
  498. ; d0=d0/d1 (divu.l d1,d0)
  499. ; => d2: remainder
  500. ;
  501. ;
  502. ; d0/d1/d2/d5/d6 affected
  503. ;
  504. divu32:
  505.     cmp.l    d0,d1
  506.     bls.s    1$
  507.     move.l    d0,d2
  508.     moveq    #0,d0
  509.     rts
  510.  
  511. 1$:    moveq    #0,d2
  512.     moveq    #0,d5
  513.     moveq    #31,d6
  514. \loop:    add.l    d0,d0
  515.     addx.l    d2,d2
  516.     add.l    d5,d5
  517.     cmp.l    d1,d2
  518.     dbge    d6,\loop
  519.     blt.s    \out
  520.     sub.l    d1,d2
  521.     addq.b    #1,d5
  522.     dbra d6,\loop
  523. \out:    move.l    d5,d0
  524.     rts
  525.  
  526.  
  527. ;------------------------------------------------
  528. ;
  529. ; PrintTitle    - print title to the StdOut channel using the parent task...
  530. ;
  531. PrintTitle:
  532.     lea    progbase(pc),a5
  533.     lea    TitleText(pc),a0
  534.     printtext_    ,,,bra
  535.  
  536.  
  537. ;------------------------------------------------
  538. ;
  539. ; DoRawFmt    - Format a string
  540. ;
  541. ; a0: format
  542. ; a1: data stream
  543. ; a3: dest. buffer
  544. ;
  545. DoRawFmt:
  546.     movem.l    d0-a6,-(a7)
  547.     lea    .setin(pc),a2
  548.     move.l    4.w,a6
  549.     jsr    _LVORawDoFmt(a6)
  550.     movem.l    (a7)+,d0-a6
  551.     rts
  552.  
  553. .setin:    move.b    d0,(a3)+
  554.     rts
  555.  
  556.  
  557. ;------------------------------------------------
  558. ;
  559. ; InstallDaemon    - install a 'busy looping' slave process
  560. ;
  561. ; => d0: daemon task structure (CCR)
  562. ;
  563. InstallDaemon:
  564.     lea    progbase(pc),a5
  565.     move.l    4.w,a6
  566.  
  567.     lea    DaemonName(pc),a0        ; generate a unique process name
  568.     lea    rawlist(pc),a1
  569.     move.l    ThisTask(a6),(a1)
  570.     lea    DaemonNameReal(pc),a3
  571.     bsr    DoRawFmt
  572.  
  573.     jsr    _LVOForbid(a6)
  574.  
  575.     mea    DaemonNameReal(pc),d1
  576.     moveq    #Daemon_Pri,d2
  577.     mea    DaemonCode-4(pc),d3
  578.     lsr.l    #2,d3                ;BCPL
  579.     move.l    #700,d4                ;stack
  580.     move.l    DosBase(pc),a6
  581.     jsr    _LVOCreateProc(a6)
  582.  
  583.     move.l    4.w,a6
  584.     jsr    _LVOPermit(a6)            ;does not affect d0
  585.  
  586.     move.l    d0,DaemonTask(a5)
  587.     beq.s    1$
  588.  
  589.     move.l    HandShakeMask(pc),d0        ;wait for reply (if started)
  590.     jsr    _LVOWait(a6)
  591.     move.l    DaemonTask(pc),d0
  592. 1$:    rts
  593.  
  594.  
  595.  
  596. ;
  597. ; daemon code
  598. ;
  599.     align.l
  600.     dc.l    0                ;length
  601.     dc.l    0
  602.  
  603. DaemonCode:
  604.     lea    progbase(pc),a5
  605.     clr.l    DaemonTask(a5)
  606.     pea    de_signal(pc)            ;if error  ->  de_signal
  607.  
  608.     moveq    #-1,d0                ;allocate signal bit for port
  609.     move.l    4.w,a6
  610.     jsr    _LVOAllocSignal(a6)
  611.     move.l    d0,SignalNumber(a5)
  612.     move.l    d0,d2
  613.     bmi    de_exit
  614.  
  615. .port:    lea    TimePort(pc),a1            ;add port
  616.     move.l    4.w,a6
  617.     move.b    #NT_MSGPORT,LN_TYPE(a1)
  618.     move.b    #PA_SIGNAL,MP_FLAGS(a1)
  619.     move.b    d2,MP_SIGBIT(a1)
  620.     move.l    ThisTask(a6),MP_SIGTASK(a1)
  621.     clr.l    LN_NAME(a1)
  622. ;    jsr    _LVOAddPort(a6)
  623.  
  624. .device:                    ;open timer device
  625.     lea    TimeRequest(pc),a1
  626.     moveq    #UNIT_MICROHZ,d0
  627.     moveq    #0,d1
  628.     lea    TimerName(pc),a0
  629.     jsr    _LVOOpenDevice(a6)
  630.     tst.l    d0
  631.     bne    de_remport
  632.     move.l    TimeRequest+IO_DEVICE(pc),TimerBase(a5)
  633.     beq    de_closedevice
  634.  
  635.     move.l    ThisTask(a6),a0
  636.     move.l    a0,DaemonTask(a5)
  637.     mea    Switch(pc),TC_SWITCH(a0)
  638.     mea    Launch(pc),TC_LAUNCH(a0)
  639.     or.b    #TF_SWITCH|TF_LAUNCH,TC_FLAGS(a0)
  640.  
  641.     addq.l    #4,a7                ;remove 'de_signal' from stack
  642.     bsr    de_signal
  643.  
  644. waitloop:                    ;busy wait loop
  645.     move.l    #$1000,d7
  646.     move.l    d7,d1
  647.     moveq     #0,d0
  648.     move.l    4.w,a6
  649.     jsr    _LVOSetSignal(a6)
  650.     and.l    d7,d0                ;Ctrl-C?
  651.     beq.s    waitloop
  652.  
  653.     move.l    ThisTask(a6),a0
  654.     and.b    #(~(TF_SWITCH|TF_LAUNCH))&$ff,TC_FLAGS(a0)
  655.     clr.l    TC_SWITCH(a0)
  656.     clr.l    TC_LAUNCH(a0)
  657.  
  658.  
  659. de_closedevice:                    ;close timer device
  660.     lea    TimeRequest(pc),a1
  661.     move.l    4.w,a6
  662.     jsr    _LVOCloseDevice(a6)
  663.  
  664. de_remport:                    ;remove port
  665. ;    lea    TimePort(pc),a1
  666. ;    move.l    4.w,a6
  667. ;    jsr    _LVORemPort(a6)
  668.  
  669. de_freesignal:                    ;free signal
  670.     move.l    SignalNumber(pc),d0
  671.     bmi.s    de_exit
  672.     move.l    4.w,a6
  673.     jsr    _LVOFreeSignal(a6)
  674.  
  675. de_exit:
  676.     rts
  677.  
  678. ;
  679. ; send a signal to the master task
  680. ;
  681. de_signal:
  682.     move.l    4.w,a6
  683.     move.l    HandShakeMask(pc),d0
  684.     move.l    MasterTask(pc),a1
  685.     jmp    _LVOSignal(a6)
  686.  
  687.  
  688.  
  689. DaemonName:    dc.b    gea_progname,"_slave.%08lx",0
  690. DaemonNameReal:    dc.b    gea_progname,"_slave.00000000",0
  691.         even
  692.  
  693.  
  694.  
  695. ;-------------------------------------------------------------------------------
  696. *
  697. * Switch & Launch
  698. *
  699. ;-------------------------------------------------------------------------------
  700.  
  701. ;
  702. ; task loses CPU
  703. ;
  704. Switch:
  705.     movem.l    d0-a6,-(a7)
  706.     move.l    4.w,a6
  707.     lea    TimeRequest(pc),a1
  708.     mea    TimePort(pc),MN_REPLYPORT(a1)
  709.     move.w    #TR_GETSYSTIME,IO_COMMAND(a1)
  710.     move.b    #IOF_QUICK,IO_FLAGS(a1)
  711.     jsr    _LVODoIO(a6)
  712.     move.l    TimerBase(pc),a6
  713.     lea    ResultTime(pc),a0
  714.     lea    TimeRequest+IOTV_TIME(pc),a1
  715.     jsr    _LVOAddTime(a6)
  716.     movem.l    (a7)+,d0-a6
  717.     rts
  718.  
  719. ;
  720. ; task gets CPU
  721. ;
  722. Launch:    
  723.     movem.l    d0-a6,-(a7)
  724.     move.l    4.w,a6
  725.     lea    TimeRequest(pc),a1
  726.     mea    TimePort(pc),MN_REPLYPORT(a1)
  727.     move.w    #TR_GETSYSTIME,IO_COMMAND(a1)
  728.     move.b    #IOF_QUICK,IO_FLAGS(a1)
  729.     jsr    _LVODoIO(a6)
  730.     move.l    TimerBase(pc),a6
  731.     lea    ResultTime(pc),a0
  732.     lea    TimeRequest+IOTV_TIME(pc),a1
  733.     jsr    _LVOSubTime(a6)
  734.     movem.l    (a7)+,d0-a6
  735.     rts
  736.  
  737.  
  738.  
  739. ;-------------------------------------------------------------------------------
  740. *
  741. * external routines
  742. *
  743. ;-------------------------------------------------------------------------------
  744.     include    startup4.r
  745.     include    progressbars.r
  746.  
  747. ;-------------------------------------------------------------------------------
  748. *
  749. * data area
  750. *
  751. ;-------------------------------------------------------------------------------
  752. processname:    dc.b    gea_progname,0
  753. TimerName:    dc.b    "timer.device",0
  754.  
  755. TitleText:    dc.b    $9b,"1m",gea_progname,$9b,"0m v",version
  756.         dc.b    " - Written 1993 by Daniel Weber",$a,0
  757.  
  758. cpuloadtxt:    dc.b    " %3d.%1d%%  ",0
  759.         even
  760.  
  761. ;
  762. ; easy requester structure
  763. ;
  764. easystruct:    dc.l    EasyStruct_SIZEOF
  765.         dc.l    0            ;flags
  766.         dc.l    .title            ;title
  767.         dc.l    .about
  768.         dc.l    .ok
  769. .title:        dc.b    gea_progname," v",version," - About...",0
  770. .ok:        dc.b    "Continue",0
  771. .about:        dc.b    gea_progname," v",version,$a
  772.         dc.b    "Written 1993 by Daniel Weber",$a
  773.         dc.b    "(assembled on the ",__date,")",$a,$a
  774.         dc.b    "Written using the ProAsm assembler.",$a,$a
  775.         dc.b    "This program is Public Domain.",$a
  776.         dc.b    "No Warranty, use at your own risk!",$a,0
  777.         even
  778.  
  779.  
  780. ;
  781. ; window and its gadget(s)
  782. ;
  783. NewWindowStructure:
  784.     dc.w    0,0        ;window XY origin relative to TopLeft of screen
  785.     dc.w    WindowWidth,WindowHeight    ;window width and height
  786.     dc.b    0,1                ;detail and block pens
  787.     dc.l    MENUPICK            ;IDCMP flags
  788.     dc.l    WFLG_SMART_REFRESH        ;other window flags
  789.     dc.l    Gadget1                ;first gadget in gadget list
  790.     dc.l    0                ;custom CHECKMARK imagery
  791.     dc.l    0                ;window title
  792.     dc.l    0                ;custom screen pointer
  793.     dc.l    0                ;custom bitmap
  794.     dc.w    WindowWidth,WindowHeight    ;minimum width and height
  795.     dc.w    WindowWidth,WindowHeight    ;maximum width and height
  796.     dc.w    WBENCHSCREEN            ;destination screen type
  797.  
  798. ;
  799. ; used GTYP_WDRAGGING gadget type to simulate a dragbar (V37)
  800. ;
  801. Gadget1:dc.l    0        ;next gadget
  802.     dc.w    0,0        ;origin XY of hit box relative to window TopLeft
  803.     dc.w    0,0        ;hit box width and height
  804.     dc.w    GADGHBOX+GRELWIDTH+GRELHEIGHT+GADGHIMAGE    ;flags
  805.     dc.w    GADGIMMEDIATE    ;activation flags
  806.     dc.w    GTYP_WDRAGGING    ;gadget type flags
  807.     dc.l    0        ;gadget border or image to be rendered
  808.     dc.l    0        ;alternate imagery for selection
  809.     dc.l    0        ;first IntuiText structure
  810.     dc.l    0        ;gadget mutual-exclude long word
  811.     dc.l    .info        ;SpecialInfo structure
  812.     dc.w    0        ;user-definable data (ID)
  813.     dc.l    0        ;pointer to user-definable data
  814.  
  815. .info:    dc.w    0        ;PropInfo flags
  816.     dc.w    0,1800        ;horizontal and vertical pot values
  817.     dc.w    2000,256    ;horizontal and vertical body values
  818.     dc.w    0,0,0,0,0,0    ;Intuition initialized and maintained variables
  819.  
  820. ;
  821. ; menu structure of perfmon
  822. ;
  823. MenuList:
  824.     dc.l    0            ;next Menu structure
  825.     dc.w    0,0            ;XY origin of Menu hit box
  826.     dc.w    63,0            ;Menu hit box width and height
  827.     dc.w    MENUENABLED        ;Menu flags
  828.     dc.l    MenuName        ;text of Menu name
  829.     dc.l    MenuItem1        ;MenuItem linked list pointer
  830.     dc.w    0,0,0,0            ;Intuition variables
  831.  
  832.  
  833. MenuItem1:                ;ABOUT
  834.     dc.l    MenuItem2        ;next MenuItem structure
  835.     dc.w    0,0            ;XY of Item hitbox
  836.     dc.w    84,10            ;hit box width and height
  837.     dc.w    ITEMTEXT+ITEMENABLED+HIGHCOMP    ;Item flags
  838.     dc.l    0
  839.     dc.l    .text            ;Item render
  840.     dc.l    0            ;Select render
  841.     dc.b    0            ;alternate command-key
  842.     dc.b    0            ;fill byte
  843.     dc.l    0            ;SubItem list
  844.     dc.w    MENUNULL
  845.  
  846. .text:    dc.b    0,0            ;front and back text pens
  847.     dc.b    RP_JAM1,0        ;drawmode and fill byte
  848.     dc.w    2,1            ;XY origin
  849.     dc.l    Topaz80            ;font pointer or NULL for default
  850.     dc.l    texttext1        ;pointer to text
  851.     dc.l    0            ;next IntuiText structure
  852.  
  853. MenuItem2:                ;QUIT
  854.     dc.l    0            ;next MenuItem structure
  855.     dc.w    0,12            ;XY of Item hitbox
  856.     dc.w    84,10            ;hit box width and height
  857.     dc.w    ITEMTEXT+COMMSEQ+ITEMENABLED+HIGHCOMP    ;Item flags
  858.     dc.l    0
  859.     dc.l    .text            ;Item render
  860.     dc.l    0            ;Select render
  861.     dc.b    'Q'            ;alternate command-key
  862.     dc.b    0            ;fill byte
  863.     dc.l    0            ;SubItem list
  864.     dc.w    MENUNULL        ;MENUNULL=$FFFF
  865.  
  866. .text:    dc.b    0,0            ;front and back text pens
  867.     dc.b    RP_JAM1,0        ;drawmode and fill byte
  868.     dc.w    2,1            ;XY origin
  869.     dc.l    Topaz80            ;font pointer or NULL for default
  870.     dc.l    texttext2        ;pointer to text
  871.     dc.l    0            ;next IntuiText structure
  872.  
  873. MenuName:    dc.b    'Project',0
  874. texttext1:    dc.b    'About...',0
  875. texttext2:    dc.b    'Quit',0
  876.         even
  877.  
  878. ;
  879. ; font...
  880. ;
  881.     align.l
  882. Topaz80:dc.l    .font            ;ta_name
  883.     dc.w    8            ;ta_ysize
  884.     dc.b    0,1            ;ta_style, ta_flags
  885. .font:    dc.b    "topaz.font",0
  886.     even
  887.  
  888.  
  889. bar1:        ProgressStruct_ bar1,1000,0
  890. bar1_wd:    EQU    bar1+pgb_window
  891. bar1_val:    EQU    bar1+pgb_value
  892.     
  893.  
  894.  
  895.  
  896. dxstart:
  897. ;-------------------------------------------------------------------------------
  898. InitSP:        dx.l    1        ; initial sp
  899.  
  900. ;-- system ------------------------------------------------
  901. Windowhandle:    dx.l    1        ; window handle
  902. WindowFont:    dx.l    1        ; window font
  903. tickcounter:    dx.w    1        ; tick counter for intuiticks
  904. MasterTask:    dx.l    1        ; task address for PerfMon
  905. rawlist:    dx.l    1        ; rawlist for DoRawFmt
  906.  
  907. ;-- daemon ------------------------------------------------
  908. DaemonTask:    dx.l    1        ; daemon task
  909. HandShakeSig:    dx.l    1        ; signal number
  910. HandShakeMask:    dx.l    1        ; sigbit mask for task communication
  911.  
  912. ;-- flags -------------------------------------------------
  913. quitflag:    dx.b    1        ; 0: do not              -: quit...
  914. timeropened:    dx.b    1        ; 0: timer devive not... -: open
  915.         aligndx.w
  916.  
  917. ;-- timer -------------------------------------------------
  918. TimerBase:    dx.l    1        ; timer base (daemon)
  919. TimerBase2:    dx.l    1        ; timer base (master)
  920. SignalNumber:    dx.l    1        ; signal number for port (demon task)
  921. SignalNumber2:    dx.l    1        ; signal number for port (master task)
  922.  
  923. TimeRequest:    dx.b    IOTV_SIZE    ; timer request structure (daemon)
  924. TimeRequest2:    dx.b    IOTV_SIZE    ; timer request structure (master)
  925.  
  926. ResultTime:    dx.b    TV_SIZE        ; result time (daemon)
  927. ResultTime2:    dx.b    TV_SIZE        ; result time (master)
  928.  
  929. TimePort:    dx.b    MP_SIZE        ; (daemon)
  930. TimePort2:    dx.b    MP_SIZE        ; (master)
  931.  
  932. ;-- buffer ------------------------------------------------
  933. workbuffer:    dx.b    workspace
  934.  
  935. ;-------------------------------------------------------------------------------
  936.     aligndx.w
  937. dxend:
  938.     end
  939.